import axios from "axios"
import Vue from 'vue'
import config from "@/config";
import baseUrl from '@/baseUrl';

const startProgress = () => Vue.prototype.$bus.$emit('progress-start');
const closeProgress = () => Vue.prototype.$bus.$emit('progress-close');

// axios基础配置并定义axios全局变量
Vue.prototype.$axios = process.env.NODE_ENV === 'development' ? axios.create({
    baseURL: baseUrl.dev,
    timeout: config.TIMEOUT_DEV
}) : axios.create({
    // 此处填入生产环境请求baseURL
    baseURL: baseUrl.prod,
    timeout: config.TIMEOUT_PROD
});

// 定义axios请求拦截器
Vue.prototype.$axios.interceptors.request.use((req) => {
    // 在请求之前做些什么

    // 启动进度条
    startProgress();

    return req;
}, (err) => {
    // 对响应错误做些什么

    // 关闭进度条
    closeProgress();

    console.log(err)
    Vue.prototype.$message({
        message: '请求出错，请检查网络连接',
        type: 'error'
    });
    return Promise.reject(err);
});

// 定义axios响应拦截器
Vue.prototype.$axios.interceptors.response.use((res) => {
    // 在收到数据后第一时间做些什么

    // 关闭进度条
    closeProgress();

    // esay-mock返回的是对象，flask会返回json字符串
    // 下面是为了在后端未部署时，使easy - mock返回数据与实际后端数据一致
    res.data = JSON.stringify(res.data);
    res.data = JSON.parse(res.data);
    console.log(`请求url：${res.config.url}`, JSON.parse(JSON.stringify(res.data)));
    return res;
}, (err) => {
    // 关闭进度条
    closeProgress();

    // 错误处理
    console.log(JSON.parse(JSON.stringify(err)));
    Vue.prototype.$message({
        message: getErrMsg(err),
        type: 'error'
    });
    return Promise.reject(err);
});

function getErrMsg(err) {
    if (err.message.includes('timeout')) {
        return '请求超时，请稍后重试';
    }
    if (!err.response) {
        return '网络不可用，请稍后重试';
    }
    const message = config.ERR_CODE_LIST[err.response.status];
    if (message) {
        return message;
    }
    return '服务器出错，请稍后重试，若长时无法处理请联系管理员';
}

export default Vue;
export const $axios = Vue.prototype.$axios;